const CryptoJS = require("crypto-js");

function Aes256(config) {
  const Hashkey = config.key; // 秘钥
  const HashIv = config.iv; // 偏移量

  // key 和 iv必须使用 CryptoJS.enc.Utf8.parse 编码
  const key = CryptoJS.enc.Utf8.parse(Hashkey);
  // iv 使用 CryptoJS.enc.Utf8.parse编码后 会默认使用前面16位
  const iv = CryptoJS.enc.Utf8.parse(HashIv);

  // 加密 模式
  const encryptMode = {
    iv: iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7,
  };

  // 加密
  this.encrypt = (data) => {
    let encrypted = CryptoJS.AES.encrypt(
      JSON.stringify(data),
      key,
      encryptMode
    );
    // 输出密文格式 [Base64格式]
    return encrypted.ciphertext.toString(CryptoJS.enc.Base64);
  };

  // 解密
  this.decrypt = (data) => {
    // 密文 [指定密文格式]
    // 注 : 如果 直接传入密文 则默认是Base64格式密文输入 例 : CryptoJS.AES.decrypt(data)
    // 加密输出的是什么格式 则解密输入就需要使用对应的格式解码

    let ciphertext = {
      ciphertext: CryptoJS.enc.Base64.parse(data),
    };

    let result = CryptoJS.AES.decrypt(ciphertext, key, encryptMode);
    try {
      // 解码
      result = result.toString(CryptoJS.enc.Utf8);
      return {
        state: 1,
        data: JSON.parse(result),
        message: "解析成功",
      };
    } catch (err) {
      return {
        state: 0,
        data: err,
        message: "解析失败",
      };
    }
  };
}

export default Aes256;
